package main

import (
	"encoding/json"
	"github.com/gin-gonic/gin"
	"log"
	"net/http"
)
import "github.com/thinkerou/favicon"

// 自定义中间件(java中叫拦截器)
func myHandler () (gin.HandlerFunc) {
	return func(c *gin.Context){
		// 通过自定义中间件，设置的值，在后续处理只要调用了这个中间件的都可以拿到这里的参数
		c.Set("usersession", "Nexora1")
		c.Next() // 放行
		//c.Abort() // 阻止
	}
}

func main() {
	// 创建一个服务
	ginServer := gin.Default()
	ginServer.Use(favicon.New("./favicon.ico"))

	// 链接数据库的代码

	// 加载静态页面
	ginServer.LoadHTMLGlob("./templates/*")
	// 加载资源文件
	ginServer.Static("/static", "./static")

	// 访问地址， 处理请求 Request Response
	ginServer.GET("/hello", func(context *gin.Context) {
		context.JSON(200, gin.H{"msg": "hello,world"})
	})

	// 响应一个页面给前端
	ginServer.GET("/index", func(c *gin.Context) {
		// context.JSON()  json数据
		c.HTML(http.StatusOK, "index.html", gin.H{
			"msg": "这里是go 后端数据",
		})
	})

	// 传递参数
	// url? userid=xxx&username=Nexora
	ginServer.GET("/user/info",myHandler(), func(c *gin.Context) {

		// 取出中间件设置的值
		usersession := c.MustGet("usersession").(string)
		log.Println("===========>",  usersession)

		// localhost:8093/user/info?userid=12.9&username=Nexora
		UserId := c.Query("userid")
		UserName := c.Query("username")
		c.JSON(http.StatusOK, gin.H{
			"UserId":   UserId,
			"UserName": UserName,
		})
	})

	// /user/info/12.9/Nexora
	ginServer.GET("/user/info/:userid/:username", func(c *gin.Context) {
		//http://localhost:8093/user/info/1/Nexora
		userId := c.Param("userid")
		userName := c.Param("username")
		c.JSON(http.StatusOK, gin.H{
			"userId":   userId,
			"userName": userName,
		})
	})

	// 掌握技术后面的应用  -  掌握基础知识，加以了解web开发
	// 前端给后端传递 json
	ginServer.POST("/json", func(c *gin.Context) {
		// request.body
		// []byte
		data, _ := c.GetRawData()
		var m map[string]interface{}
		// 包装成为json数据
		_ = json.Unmarshal(data, &m)
		c.JSON(http.StatusOK, gin.H{
			"status":  200,
			"message": "success",
			"data":    m,
		})
	})

	ginServer.POST("/user/add", func(c *gin.Context) {
		username := c.PostForm("username")
		password := c.PostForm("password")

		if username == "" || password == "" {
			c.JSON(http.StatusOK, gin.H{
				"msg":"error",
			})
		}
		c.JSON(http.StatusOK, gin.H{
			"msg":"ok",
			"username":username,
			"password":password,
		})
	})

	// 路由
	ginServer.GET("/test", func(c *gin.Context){
		// 重定向 301
		c.Redirect(http.StatusMovedPermanently,"https://www.bilibili.com")
	})

	// 404 NoRoute
	ginServer.NoRoute(func(c *gin.Context){
		c.HTML(http.StatusNotFound,"404.html",nil)
	})

	// 路由组 /user/add
	userGroup := ginServer.Group("/user")
	{
		userGroup.GET("/add")
		userGroup.POST("/login")
		userGroup.POST("/logout")
	}

	orderGroup := ginServer.Group("/order")
	{
		orderGroup.GET("/orderList")
		orderGroup.GET("/orderDelete")
	}

	// 服务器端口
	ginServer.Run(":8093")

}
